#ifndef APP_MIDI_H
#define APP_MIDI_H

#include "stdint.h"
#include "gpio.h"

#ifndef APP_USB_MIDI_DATA_DECODE
#define APP_USB_MIDI_DATA_DECODE    1
#endif


// 定义踏板状态枚举
typedef enum
{
    TABAN_STATE_OFF = 0,  // 踏板关闭
    TABAN_STATE_HIT,      // 第一阶段：打击
    TABAN_STATE_RETURN,   // 第二阶段：回击
    TABAN_STATE_HOVER     // 第三阶段：悬停
} TABAN_State;

typedef struct {
    TABAN_State state;          // 当前踏板状态
    uint8_t pwm_channel;        // PWM 通道号
    uint16_t hit_duration;      // 打击阶段持续时间（单位：ms）
    uint16_t hit_period;        // 打击阶段 PWM 周期（单位：ms）
    uint8_t hit_duty_cycle;     // 打击阶段占空比

    uint16_t return_duration;   // 回击阶段持续时间（单位：ms）
    uint16_t return_period;     // 回击阶段 PWM 周期（单位：ms）
    uint8_t return_duty_cycle;  // 回击阶段占空比

    uint16_t hover_duration;    // 悬停阶段持续时间（单位：ms）
    uint16_t hover_period;      // 悬停阶段 PWM 周期（单位：ms）
    uint8_t hover_duty_cycle;   // 悬停阶段占空比
} PedalControl;

void app_taban_switch_state(uint8_t pwm_channel);

void app_midi_handle_msg(uint8_t midi_msg[3]);

void app_midi_handle_cmd(uint8_t *data, uint16_t size);

void app_handle_usb_midi_data(uint8_t *data, uint16_t len);

void app_msg_process_midi_data(uint8_t *data, uint16_t size);

// 新增踏板关闭函数声明
void app_taban_stop_all(void);

// 新增力度设定模式MIDI处理函数声明
void app_midi_handle_msg_force_setting(uint8_t midi_msg[3]);

// 新增：从Flash应用踏板力度参数
void app_taban_apply_flash_params(void);

uint8_t app_midi_flash_save_solenoid_durations(void);

#endif
